Flutter lifecycle


图腾

Flutter 生命周期实际测试出来的与Flutter官网描述的有些不同,具体往下看


目录:

1、Flutter 生命周期
2、Todo:自己实测与Flutter官网描述出现的不一致情况!

1、Flutter 生命周期

官网介绍如下

AppLifecycleState:Flutter widget 生命周期状态

–官网介绍如下图:
|Flutter 官网介绍生命周期.png|
|:-|

实测

1.1:AppLifecycleState.resumed

可见,并且响应用户输入

1.2:AppLifecycleState.inactive
或许可见,但一定不响应用户输入;此状态表明,应用程序处于非活动状态;在Android和IOS上测试都会出现:inactive出现在resumed和paused之前。

1.3:AppLifecycleState.paused
不可见,进入后台;此状态表明,将随时进入suspending

1.4:AppLifecycleState.suspending
在Android和IOS上,暂时未测出此状态的出现

2、Todo

2、Todo:自己实测与Flutter官网描述出现的不一致情况!

官网测试代码

import 'package:flutter/widgets.dart';

class LifecycleWatcher extends StatefulWidget {
  @override
  _LifecycleWatcherState createState() => _LifecycleWatcherState();
}

class _LifecycleWatcherState extends State<LifecycleWatcher> with WidgetsBindingObserver {
  AppLifecycleState _lastLifecycleState;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    setState(() {
      _lastLifecycleState = state;
    });
  }

  @override
  Widget build(BuildContext context) {
    if (_lastLifecycleState == null)
      return Text('This widget has not observed any lifecycle changes.', textDirection: TextDirection.ltr);

    return Text('The most recent lifecycle state this widget observed was: $_lastLifecycleState.',
        textDirection: TextDirection.ltr);
  }
}

void main() {
  runApp(Center(child: LifecycleWatcher()));
}

描述1:
此测试代码不够完善,因为:“此代码只能测试resumed一个状态,其他的状态是测试不出来的”

描述2:
Flutter的渲染机制:调用setState((){})函数时,会启动Flutter重绘制机制,进而调用build(BuildContext context)函数。

问题:
当实际测试时并非如描述2那般一模一样。如上图代码所示,在didChangeAppLifecycleState函数中调用setState,在build中显示AppLifecycleState(也就是widget的生命周期状态)当Widget生命周期状态切换为inactive或paused状态时,实际测试出的结果是,并没有调用build函数进行重绘

进一步更新上述测试进度
出现上方的问题的原因在与:Flutter生命周期的转换会影响到build函数的调用时机(上方在build函数中输入的数据无法根据生命周期的变动而变动就是因为在某些生命周期内build是没有备调用渲染!)。


未完待续。。。


   转载规则


《Flutter lifecycle》 Air 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录